package xyz.wbsite.zentao.sdk;

import xyz.wbsite.zentao.sdk.user.ent.ZtUser;
import xyz.wbsite.zentao.sdk.user.req.ZtUserListAllRequest;
import xyz.wbsite.zentao.sdk.user.rsp.ZtUserListAllResponse;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 禅道客户端
 * <p>
 * 基于开源版本18.1开发
 *
 * @author wangbing
 * @version 0.0.1
 * @since 1.8
 */
public class ZentaoClient {

    /**
     * 普通禅道账户
     */
    private static Map<String, ZentaoInstance> cache = new ConcurrentHashMap<>();

    /**
     * 普通禅道账户
     */
    private final ZentaoInstance managerInstance;


    /**
     * 禅道服务地址
     */
    private final String serviceUrl;

    /**
     * 禅道服务接入code
     */
    private final String serviceCode;

    /**
     * 禅道服务接入key
     */
    private final String serviceKey;

    /**
     * 禅道客户端构造器
     *
     * @param serviceUrl     禅道服务地址
     * @param serviceCode    禅道服务接入code
     * @param serviceKey     禅道服务接入key
     * @param managerAccount 管理账户
     */
    public ZentaoClient(String serviceUrl, String serviceCode, String serviceKey, String managerAccount) {
        this.serviceUrl = serviceUrl;
        this.serviceCode = serviceCode;
        this.serviceKey = serviceKey;
        this.managerInstance = new ZentaoInstance(this, managerAccount);
    }

    /**
     * 查询所有账户信息
     * <p>
     * 要求managerAccount账户有管理员权限
     */
    public List<ZtUser> listAllUser() {
        ZtUserListAllResponse ztUserListAllResponse = managerInstance.getZtUserService().listAll(new ZtUserListAllRequest());
        if (!ztUserListAllResponse.isSuccess()) {
            throw new IllegalArgumentException(ztUserListAllResponse.getMessage());
        }
        return ztUserListAllResponse.getResult();
    }

    /**
     * 普通账号进入
     */
    public ZentaoInstance loginAs(String account) {
        if (cache.containsKey(account)) {
            return cache.get(account);
        }
        cache.put(account, new ZentaoInstance(this, account));
        return cache.get(account);
    }

    /**
     * 项目管理账号进入
     */
    public ZentaoInstance loginAsPms() {
        return managerInstance;
    }

    public String getServiceUrl() {
        return serviceUrl;
    }

    public String getServiceCode() {
        return serviceCode;
    }

    public String getServiceKey() {
        return serviceKey;
    }
}
